「你看,測試都 passed 欸」
在工業工程(IE)與豐田生產方式(TPS)中,有一個極度核心的原則叫做「自働化(Jidoka)」——只要機器一偵測到異常,就要立刻「拉燈停線(Andon)」。停線看起來很浪費時間,但這是避免產出大量不良品的唯一方法。
但 AI 寫 Code 的邏輯完全相反。AI 的目標是「讓這段 Code 看起來會動,而且不會噴紅字」。當它遇到不確定的邊界條件,或者不知道怎麼處理的外部依賴時,它最喜歡做的事情就是「吞掉錯誤(Swallowing Exceptions)」。
發生了連線 Timeout?吞掉。發生了 Null Pointer?吞掉。最後的結果就是,使用者的訂單沒有結帳成功,但系統回傳 200 OK。這種「外表看似正常,內部已經爛掉」的狀態,在工廠裡叫做「隱性瑕疵」,是所有品管人員最害怕的惡夢。
來看看 AI 最愛寫的垃圾錯誤處理吧
def process_payment(order_id):
try:
# 為了 pass 隨便亂寫一通
gateway.charge(order_id)
db.update_status(order_id, "PAID")
except Exception as e:
#捕捉所有錯誤,然後裝死
print(f"Something went wrong: {e}")
pass
光靠 Code Review 去抓這種 except Exception 太慢了,人眼總有漏看的時候。我們直接在靜態分析工具 Ruff 裡面,把「禁止盲目捕捉例外(Blind Except)」的規則打開
# pyproject.toml
[tool.ruff]
# BLE001: 嚴格禁止 catch Exception 卻不 re-raise 的行為
# RET505: 強制 return 提早結束,避免巢狀地獄
select = ["E", "F", "BLE", "RET"]
[tool.ruff.flake8-blind-except]
# 不准吃掉任何非預期的系統層級 Error
strict = true